package cn.edu.zut.project1.service.Impl;

import cn.edu.zut.project1.dto.RegisterDTO;
import cn.edu.zut.project1.mapper.UserMapper;
import cn.edu.zut.project1.pojo.User;
import cn.edu.zut.project1.dto.LoginDTO;
import cn.edu.zut.project1.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * 用户业务逻辑实现类
 * 实现具体的业务逻辑处理
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 登录业务逻辑实现
     * 1. 根据账号查询用户
     * 2. 验证用户状态和密码
     *
     * @param loginDTO 登录参数
     * @return 登录成功的用户信息（剔除密码）
     */
    @Override
    @Transactional // 事务管理，确保更新登录时间和查询的原子性
    public User login(LoginDTO loginDTO) {
        // 1. 根据账号查询用户
        User user = userMapper.selectByAccount(loginDTO.getUserAccount());
        if (user == null) {
            throw new RuntimeException("账号不存在");
        }

        // 2. 验证用户是否可用（isLogin=0表示可用）
        if (user.getIsLogin() != 0) {
            throw new RuntimeException("账号已被禁用，无法登录");
        }

        // 3. 验证密码
        if (!user.getUserPassword().equals(loginDTO.getUserPassword())) {
            throw new RuntimeException("密码错误");
        }

        // 4. 清空密码，避免返回给前端
        user.setUserPassword(null);
        return user;
    }

    /**
     * 注册业务逻辑实现
     * 1. 根据账号查询用户(判断有没有相同用户名的用户)
     * 2.判断密码和确认密码是否相等
     * 3. 初始化信息(昵称初始化为“用户”+时间，头像为null，用户角色为用户
     * 克登陆状态为0，禁言状态为0,注册时间)
     * 4.在数据库中增加用户的各种信息
     *
     * @param registerDTO 登录参数
     */
    public void register(RegisterDTO registerDTO) {
        /**
         * 1.根据账号查询用户
         */
        User user = userMapper.selectByAccount(registerDTO.getUserAccount());
        if (user != null) {
            throw new RuntimeException("账号已存在");
        }
        /**
         * 2.判断密码和确认密码是否相等
         */

        if(!registerDTO.getUserPassword().equals(registerDTO.getConfirmPassword())) {
            throw new RuntimeException("确认密码和密码不相等");
        }

        /**
         * 3.初始化对象
         */
        User newUser = new User();
        newUser.setUserAccount(registerDTO.getUserAccount()); // 账号
        newUser.setUserPassword(registerDTO.getUserPassword()); // 密码
        newUser.setUserEmail(registerDTO.getUserEmail());       // 邮箱
        newUser.setUserName("用户" + System.currentTimeMillis()); // 昵称默认值（用户+时间戳）
        newUser.setUserAvatar(null); // 头像默认空
        newUser.setUserRole(0);      // 角色：0-普通用户（假设）
        newUser.setIsLogin(0);       // 可登录状态：0-可用
        newUser.setCreateTime(LocalDateTime.now()); // 注册时初始化登录时间

        /**
         * 4.插入数据库
         */
        int rows = userMapper.insert(newUser);
        if (rows != 1) {
            throw new RuntimeException("注册失败，请重试");
        }
    }
}